/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Persistencia;

import Modelo.Cliente_has_Seguro;
import Modelo.ContaPagar;
import Modelo.Seguro;
import Modelo.TipoConta;
import com.mysql.jdbc.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;

/**
 *
 * @author Particular
 */
public class BancoDeDados {

    private Connection conexao;
    private String usuario;
    private String senha;
    private String url ;
    private Statement stm;

    public BancoDeDados(String usuario, String senha, String url) {
        setUsuario(usuario);
        setSenha(senha);
        setUrl(url);

    }

    public Connection getConexao() {
        return conexao;
    }

    public void setConexao(Connection conexao) {
        this.conexao = conexao;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String url) {
        this.url = url;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    //tenta a conexao com o banco de dados
    public boolean Conectar(){
        try{
           Class.forName("org.gjt.mm.mysql.Driver");  
            conexao = (Connection) DriverManager.getConnection(url, usuario,senha);
            return true;
        }catch(SQLException e){
            e.printStackTrace();
            return false;
        }catch( ClassNotFoundException ex){
            ex.printStackTrace();
            return false;
        }
    }

    //desconecta com o banco
    public boolean Desconetar(){
        try{
            conexao.close();
            return true;
        }catch (SQLException ex) {
            return false;
        }
    }


    public boolean insercao(String query) throws SQLException{
        try{
            stm = (Statement) conexao.createStatement();
            stm.executeUpdate(query);
        } catch (SQLException ex) {
            throw new SQLException();
        }
        return true;
    }

    public ResultSet formulario(String query) throws SQLException{
        ResultSet rs=null;
        try {
                stm = (Statement) conexao.createStatement();
                rs = stm.executeQuery(query);
                } catch (SQLException ex) {
                throw new SQLException();
           }
         return rs;
    }

     //executa uma busca no banco
    public String[][] selecao(String query) throws SQLException{
            try {
                stm = (Statement) conexao.createStatement();
                ResultSet rs = stm.executeQuery(query);
                ResultSetMetaData rsmd = (ResultSetMetaData) rs.getMetaData();
                int cols = rsmd.getColumnCount();
                rs.last();
                int rows = rs.getRow();
                rs.beforeFirst();

                String[][] resultado = new String[rows][cols];
                while (rs.next()) {
                    for(int i = 0; i < cols; i++){
                        resultado[rs.getRow()-1][i] = rs.getString(i+1);
                    }
                }
                return resultado;
           } catch (SQLException ex) {
                throw new SQLException();
           }
    }

    public int[] executeStoredProcedure(TipoConta tipo, ContaPagar contP) {
        int[] retorno = new int[2];
        try {
              CallableStatement cstmt = (CallableStatement) conexao.prepareCall("{call inserirContaPagar(?,?,?,?,?,?,?,?,?,?)}");

              cstmt.setString(1, contP.getDocumento());
              cstmt.setString(2, contP.getEmissao().formatoBanco());
              cstmt.setString(3, contP.getLocalCobranca());
              cstmt.setString(4, contP.getEmitente());
              cstmt.setString(5, tipo.getTipoConta());
              cstmt.setInt(6, contP.getFunc().getId());
              cstmt.setInt(7, contP.getFunc().getIdPessoaFisica());
              cstmt.registerOutParameter(8, Types.VARCHAR);
              cstmt.registerOutParameter(9, Types.INTEGER);
              cstmt.registerOutParameter(10, Types.INTEGER);
              cstmt.execute();

              retorno[0] = cstmt.getInt(9); //cstmt.getInt(10) == RETORNO DE ID DE CONTA A PAGAR
              retorno[1] = cstmt.getInt(10); //cstmt.getInt(11) == RETORNO DE ID DE CONTA
              System.out.println("id conta a pagar "+cstmt.getInt(9));
              System.out.println("id conta "+cstmt.getInt(10));
              System.out.println(cstmt.getString(8));
              return retorno;
           }
           catch (Exception e) {
              e.printStackTrace();
              return retorno;
           }
    }
    public int executeProcedureSeguro(Seguro seg){
        int retorno=-1;
        String erro;
        try{

            /*
             *
            IN
            IN in_especie VARCHAR(15), IN in_valorMercadoria FLOAT, OUT erro VARCHAR(50), OUT out_idSeguro INT)

             */

            erro = "call cadastroSeguro("+seg.getRem().getCli().getId()+","+seg.getDest().getCli().getId()+","+seg.getMot().getIdPessoaFisica()+","+seg.getMot().getId()+",";
            erro += seg.getFunc().getIdPessoaFisica()+","+seg.getFunc().getId()+","+seg.getVeic().getIdVeiculo()+","+seg.getValorSeguro()+","+seg.getValorICMS()+",'"+seg.getCTRC()+"',";
            erro += seg.getOutros()+","+seg.getTotal()+",'"+seg.getDataSeguro().formatoBanco()+"','"+seg.getSTRC()+"','"+seg.getMer().getNome()+"','"+seg.getMer().getNaturezaCarga()+"',";
            erro += seg.getMer().getPeso()+","+seg.getMer().getQuantidade()+",'"+seg.getMer().getNotaFiscal()+"','"+seg.getMer().getEspecie()+"',"+seg.getMer().getValorMercadoria()+",'";
            erro += seg.getVendedor()+"',@erro,@seg);";
            System.out.println(erro);

            CallableStatement cstmt = (CallableStatement) conexao.prepareCall("{call cadastroSeguro (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
            cstmt.setInt(1, seg.getRem().getCli().getId());
            cstmt.setInt(2,seg.getDest().getCli().getId());
            cstmt.setInt(3,seg.getMot().getIdPessoaFisica());
            cstmt.setInt(4,seg.getMot().getId());
            cstmt.setInt(5, seg.getFunc().getIdPessoaFisica());
            cstmt.setInt(6, seg.getFunc().getId());
            cstmt.setInt(7, seg.getVeic().getIdVeiculo());
            cstmt.setFloat(8, seg.getValorSeguro());
            cstmt.setFloat(9,seg.getValorICMS());
            cstmt.setString(10,seg.getCTRC());
            cstmt.setFloat(11,seg.getOutros());
            cstmt.setFloat(12, seg.getTotal());
            cstmt.setString(13, seg.getDataSeguro().formatoBanco());
            cstmt.setString(14, seg.getSTRC());
            cstmt.setString(15, seg.getMer().getNome());
            cstmt.setString(16, seg.getMer().getNaturezaCarga());
            cstmt.setFloat(17, seg.getMer().getPeso());
            cstmt.setInt(18, seg.getMer().getQuantidade());
            cstmt.setString(19, seg.getMer().getNotaFiscal());
            cstmt.setString(20, seg.getMer().getEspecie());
            cstmt.setFloat(21, seg.getMer().getValorMercadoria());
            cstmt.setString(22,seg.getVendedor());
            cstmt.registerOutParameter(23, Types.VARCHAR);
            cstmt.registerOutParameter(24, Types.INTEGER);
           
            cstmt.execute();

            erro = cstmt.getString(23);
            retorno = cstmt.getInt(24); // RETORNO DE ID DO SEGURO
            System.out.println(erro);
            return retorno;
        }catch (Exception e) {
              e.printStackTrace();
              return retorno;
           }
    }

      public String executeProcedureAlterarSeguro(Cliente_has_Seguro seg){
        String  retorno="";
        try{


            CallableStatement cstmt = (CallableStatement) conexao.prepareCall("{call alterarSeguro (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
            cstmt.setInt(1, seg.getSeg().getRem().getCli().getId());
            cstmt.setInt(2,seg.getSeg().getDest().getCli().getId());
            cstmt.setInt(3,seg.getSeg().getMot().getIdPessoaFisica());
            cstmt.setInt(4,seg.getSeg().getMot().getId());
            cstmt.setInt(5, seg.getSeg().getFunc().getIdPessoaFisica());
            cstmt.setInt(6, seg.getSeg().getFunc().getId());
            cstmt.setInt(7, seg.getSeg().getVeic().getIdVeiculo());
            cstmt.setFloat(8, seg.getSeg().getValorSeguro());
            cstmt.setFloat(9,seg.getSeg().getValorICMS());
            cstmt.setString(10,seg.getSeg().getCTRC());
            cstmt.setFloat(11,seg.getSeg().getOutros());
            cstmt.setFloat(12, seg.getSeg().getTotal());
            cstmt.setString(13, seg.getSeg().getDataSeguro().formatoBanco());
            cstmt.setString(14, seg.getSeg().getSTRC());
            cstmt.setString(15, seg.getSeg().getMer().getNome());
            cstmt.setString(16, seg.getSeg().getMer().getNaturezaCarga());
            cstmt.setFloat(17, seg.getSeg().getMer().getPeso());
            cstmt.setInt(18, seg.getSeg().getMer().getQuantidade());
            cstmt.setString(19, seg.getSeg().getMer().getNotaFiscal());
            cstmt.setString(20, seg.getSeg().getMer().getEspecie());
            cstmt.setFloat(21, seg.getSeg().getMer().getValorMercadoria());
            cstmt.setInt(22, seg.getSeg().getMer().getIdMercadoria());
            cstmt.setInt(23, seg.getSeg().getIdSeguro());
            cstmt.setInt(24, seg.getCli().getId());
            cstmt.setFloat(25, seg.getValorJaPago());
            cstmt.setFloat(26, seg.getValorFatura());
            cstmt.registerOutParameter(27, Types.VARCHAR);
            cstmt.setString(28, seg.getSeg().getVendedor());
            cstmt.execute();

            retorno = cstmt.getString(27); // RETORNO se cadastrou ou nao
            return retorno;
        }catch (Exception e) {
              e.printStackTrace();
              return retorno;
           }
    }
}